package com.qoq.test.chapter3;

public class FinalizeEscapeGC {
    public static FinalizeEscapeGC SAVE_HOOK = null;
    public void isAlive() {
        System.out.println("yes, i'm alive");
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("finalize method executed.");
        FinalizeEscapeGC.SAVE_HOOK = this;
    }

    public static void main(String[] args) throws InterruptedException {
        SAVE_HOOK = new FinalizeEscapeGC();

        SAVE_HOOK = null;
        // 第一次GC会调用finalize方法，SAVE_HOOK被标记为要回收，但是调用finalize后，
        // SAVE_HOOK不是null了，真正的GC是在稍后某个时间执行的，那时到GC ROOT的引用链存在。
        System.gc();

        Thread.sleep(500);
        if (SAVE_HOOK != null) {
            // 存活
            SAVE_HOOK.isAlive();
        } else {
            System.out.println("no, i'm dead.");
        }

        SAVE_HOOK = null;
        // finalize方法只会被执行一次，第二次引用链不会被连上
        System.gc();
        Thread.sleep(500);
        if (SAVE_HOOK != null) {
            SAVE_HOOK.isAlive();
        } else {
            System.out.println("no, i'm dead.");
        }
    }
}
